/******************************************************************************* * Signavio Core Components * Copyright (C) 2012 Signavio GmbH * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package com.signavio.warehouse.business.util.jpdl4; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; public class Process { private String name; private String key; private String version; private String description; private String namespace = "http://jbpm.org/4.4/jpdl"; private List<com.signavio.warehouse.business.util.jpdl4.Node> childNodes; private HashMap<String, com.signavio.warehouse.business.util.jpdl4.Node> children; private Node root; public Process(Node rootNode) { this.root = rootNode; childNodes = new ArrayList<com.signavio.warehouse.business.util.jpdl4.Node>(); children = new HashMap<String, com.signavio.warehouse.business.util.jpdl4.Node>(); NamedNodeMap attributes = root.getAttributes(); this.name = JpdlToJson.getAttribute(attributes, "name"); this.key = JpdlToJson.getAttribute(attributes, "key"); this.version = JpdlToJson.getAttribute(attributes, "version"); this.description = JpdlToJson.getAttribute(attributes, "description"); if (root.hasChildNodes()) { int x = 0; try { for (Node node = root.getFirstChild(); node != null; node = node .getNextSibling()) { String stencil = node.getNodeName(); com.signavio.warehouse.business.util.jpdl4.Node item = null; if (stencil.equals("start")) item = new StartEvent(node); else if (stencil.equals("end")) item = new EndEvent(node); else if (stencil.equals("end-error")) item = new EndErrorEvent(node); else if (stencil.equals("end-cancel")) item = new EndCancelEvent(node); else if (stencil.equals("task")) item = new Task(node); else if (stencil.equals("state")) item = new State(node); else if (stencil.equals("java")) item = new Java(node); else if (stencil.equals("esb")) item = new Esb(node); else if (stencil.equals("sql")) item = new Sql(node); else if (stencil.equals("hql")) item = new Hql(node); else if (stencil.equals("script")) item = new Script(node); else if (stencil.equals("join") || stencil.equals("fork")) item = new And(node); else if (stencil.equals("decision")) item = new Xor(node); else if (stencil.equals("custom")) item = new Custom(node); if (item != null) { childNodes.add(item); try { String nodeName = node.getAttributes() .getNamedItem("name").getNodeValue(); children.put(nodeName, item); } catch (Exception e) { children.put("start" + x, item); x++; } } } } catch (Exception ee) { ee.printStackTrace(); } } } public Process(JSONObject process) { try { this.name = process.getJSONObject("properties").getString("name"); } catch (JSONException e) { } try { this.key = process.getJSONObject("properties").getString("key"); } catch (JSONException e) { } try { this.version = process.getJSONObject("properties").getString( "version"); } catch (JSONException e) { } try { this.namespace = process.getJSONObject("properties").getString("namespace"); } catch (JSONException e) { this.namespace = "http://jbpm.org/4.4/jpdl"; } try { this.description = process.getJSONObject("properties").getString( "documentation"); } catch (JSONException e) { } childNodes = new ArrayList<com.signavio.warehouse.business.util.jpdl4.Node>(); try { JSONArray processElements = process.getJSONArray("childShapes"); // Create all process nodes for (int i = 0; i < processElements.length(); i++) { JSONObject currentElement = processElements.getJSONObject(i); String currentElementID = currentElement.getJSONObject( "stencil").getString("id"); com.signavio.warehouse.business.util.jpdl4.Node item = null; if (currentElementID.equals("StartEvent")) item = new StartEvent(currentElement); else if (currentElementID.equals("EndEvent")) item = new EndEvent(currentElement); else if (currentElementID.equals("EndErrorEvent")) item = new EndErrorEvent(currentElement); else if (currentElementID.equals("EndCancelEvent")) item = new EndCancelEvent(currentElement); else if (currentElementID.equals("Task")) item = new Task(currentElement); else if (currentElementID.equals("wait")) item = new State(currentElement); else if (currentElementID.equals("java")) item = new Java(currentElement); else if (currentElementID.equals("esb")) item = new Esb(currentElement); else if (currentElementID.equals("sql")) item = new Sql(currentElement); else if (currentElementID.equals("hql")) item = new Hql(currentElement); else if (currentElementID.equals("script")) item = new Script(currentElement); else if (currentElementID.equals("AND_Gateway")) item = new And(currentElement); else if (currentElementID.equals("Exclusive_Databased_Gateway")) item = new Xor(currentElement); else if (currentElementID.equals("custom")) item = new Custom(currentElement); if (item != null) childNodes.add(item); } } catch (JSONException e) { } } public String toJpdl() throws InvalidModelException { StringWriter jpdl = new StringWriter(); jpdl.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); jpdl.write("<process"); jpdl.write(JsonToJpdl.transformAttribute("name", name)); jpdl.write(JsonToJpdl.transformAttribute("key", key)); jpdl.write(JsonToJpdl.transformAttribute("version", version)); jpdl.write(JsonToJpdl.transformAttribute("description", description)); jpdl.write(JsonToJpdl.transformAttribute("xmlns", this.namespace)); jpdl.write(" >\n\n"); for (int i = 0; i < childNodes.size(); i++) { jpdl.write(childNodes.get(i).toJpdl()); } jpdl.write("</process>"); return jpdl.toString(); } public void createTransitions() { int x = 0; for (Node node = root.getFirstChild(); node != null; node = node .getNextSibling()) { if (!node.getNodeName().equals("#text")) { com.signavio.warehouse.business.util.jpdl4.Node currentStencil; try { String currentStencilName = node.getAttributes() .getNamedItem("name").getNodeValue(); currentStencil = children.get(currentStencilName); } catch (Exception e) { currentStencil = children.get("start" + x); x++; } List<Transition> outgoings = new ArrayList<Transition>(); if (node.hasChildNodes()) { for (Node item = node.getFirstChild(); item != null; item = item .getNextSibling()) { if (item.getNodeName().equals("transition")) { Transition t = new Transition(item); t.setStart(new Docker(currentStencil.getBounds() .getWidth() / 2, currentStencil.getBounds() .getHeight() / 2)); outgoings.add(t); } } } currentStencil.setOutgoings(outgoings); } } } public String toJson() throws JSONException { JSONObject process = new JSONObject(); JSONObject stencilset = new JSONObject(); stencilset.put("url", "/editor/stencilsets/jbpm4/jbpm4.json"); stencilset.put("namespace", "http://b3mn.org/stencilset/jbpm4#"); JSONArray extensions = new JSONArray(); JSONObject stencil = new JSONObject(); stencil.put("id", "BPMNDiagram"); JSONObject properties = new JSONObject(); if (name != null) properties.put("name", name); if (key != null) properties.put("key", key); if (version != null) properties.put("version", version); if (description != null) properties.put("documentation", description); if (namespace != null) { properties.put("namespace", namespace); } process.put("resourceId", "oryx-canvas123"); process.put("stencilset", stencilset); process.put("ssextensions", extensions); process.put("stencil", stencil); process.put("properties", properties); JSONArray childShapes = new JSONArray(); // add all childShapes for (com.signavio.warehouse.business.util.jpdl4.Node n : childNodes) { childShapes.put(n.toJson()); for (Transition t : n.getOutgoings()) childShapes.put(t.toJson()); } process.put("childShapes", childShapes); return process.toString(); } public com.signavio.warehouse.business.util.jpdl4.Node getTarget(String targetName) { return children.get(targetName); } }